(function($) {
    $.ui = {
        plugin: {
            add: function(module, option, set) {
                var proto = $.ui[module].prototype;
                for (var i in set) {
                    proto.plugins[i] = proto.plugins[i] || [];
                    proto.plugins[i].push([option, set[i]]);
                }
            },
            call: function(instance, name, args) {
                var set = instance.plugins[name];
                if (!set) {
                    return;
                }
                for (var i = 0; i < set.length; i++) {
                    if (instance.options[set[i][0]]) {
                        set[i][1].apply(instance.element, args);
                    }
                }
            }
        },
        cssCache: {},
        css: function(name) {
            if ($.ui.cssCache[name]) {
                return $.ui.cssCache[name];
            }
            var tmp = $('<div class="ui-resizable-gen">').addClass(name).css({
                position: 'absolute',
                top: '-5000px',
                left: '-5000px',
                display: 'block'
            }).appendTo('body');
            $.ui.cssCache[name] = !!((!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))));
            try {
                $('body').get(0).removeChild(tmp.get(0));
            } catch(e) {}
            return $.ui.cssCache[name];
        },
        disableSelection: function(e) {
            e.unselectable = "on";
            e.onselectstart = function() {
                return false;
            };
            if (e.style) {
                e.style.MozUserSelect = "none";
            }
        },
        enableSelection: function(e) {
            e.unselectable = "off";
            e.onselectstart = function() {
                return true;
            };
            if (e.style) {
                e.style.MozUserSelect = "";
            }
        },
        hasScroll: function(e, a) {
            var scroll = /top/.test(a || "top") ? 'scrollTop': 'scrollLeft',
            has = false;
            if (e[scroll] > 0) return true;
            e[scroll] = 1;
            has = e[scroll] > 0 ? true: false;
            e[scroll] = 0;
            return has;
        }
    };
    var _remove = $.fn.remove;
    $.fn.remove = function() {
        $("*", this).add(this).trigger("remove");
        return _remove.apply(this, arguments);
    };
    function getter(namespace, plugin, method) {
        var methods = $[namespace][plugin].getter || [];
        methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods);
        return ($.inArray(method, methods) != -1);
    }
    $.widget = function(name, prototype) {
        var namespace = name.split(".")[0];
        name = name.split(".")[1];
        $.fn[name] = function(options) {
            var isMethodCall = (typeof options == 'string'),
            args = Array.prototype.slice.call(arguments, 1);
            if (isMethodCall && getter(namespace, name, options)) {
                var instance = $.data(this[0], name);
                return (instance ? instance[options].apply(instance, args) : undefined);
            }
            return this.each(function() {
                var instance = $.data(this, name);
                if (isMethodCall && instance && $.isFunction(instance[options])) {
                    instance[options].apply(instance, args);
                } else if (!isMethodCall) {
                    $.data(this, name, new $[namespace][name](this, options));
                }
            });
        };
        $[namespace][name] = function(element, options) {
            var self = this;
            this.widgetName = name;
            this.widgetBaseClass = namespace + '-' + name;
            this.options = $.extend({
                disabled: false
            },
            $[namespace][name].defaults, options);
            this.element = $(element).bind('setData.' + name, 
            function(e, key, value) {
                return self.setData(key, value);
            }).bind('getData.' + name, 
            function(e, key) {
                return self.getData(key);
            }).bind('remove', 
            function() {
                return self.destroy();
            });
            this.init();
        };
        $[namespace][name].prototype = $.extend({},
        $.widget.prototype, prototype);
    };
    $.widget.prototype = {
        init: function() {},
        destroy: function() {
            this.element.removeData(this.widgetName);
        },
        getData: function(key) {
            return this.options[key];
        },
        setData: function(key, value) {
            this.options[key] = value;
            if (key == 'disabled') {
                this.element[value ? 'addClass': 'removeClass'](this.widgetBaseClass + '-disabled');
            }
        },
        enable: function() {
            this.setData('disabled', false);
        },
        disable: function() {
            this.setData('disabled', true);
        }
    };
    $.ui.mouse = {
        mouseInit: function() {
            var self = this;
            this.element.bind('mousedown.' + this.widgetName, 
            function(e) {
                return self.mouseDown(e);
            });
            if ($.browser.msie) {
                this._mouseUnselectable = this.element.attr('unselectable');
                this.element.attr('unselectable', 'on');
            }
            this.started = false;
        },
        mouseDestroy: function() {
            this.element.unbind('.' + this.widgetName); ($.browser.msie && this.element.attr('unselectable', this._mouseUnselectable));
        },
        mouseDown: function(e) { (this._mouseStarted && this.mouseUp(e));
            this._mouseDownEvent = e;
            var self = this,
            btnIsLeft = (e.which == 1),
            elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).is(this.options.cancel) : false);
            if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) {
                return true;
            }
            this._mouseDelayMet = !this.options.delay;
            if (!this._mouseDelayMet) {
                this._mouseDelayTimer = setTimeout(function() {
                    self._mouseDelayMet = true;
                },
                this.options.delay);
            }
            if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
                this._mouseStarted = (this.mouseStart(e) !== false);
                if (!this._mouseStarted) {
                    e.preventDefault();
                    return true;
                }
            }
            this._mouseMoveDelegate = function(e) {
                return self.mouseMove(e);
            };
            this._mouseUpDelegate = function(e) {
                return self.mouseUp(e);
            };
            $(document).bind('mousemove.' + this.widgetName, this._mouseMoveDelegate).bind('mouseup.' + this.widgetName, this._mouseUpDelegate);
            return false;
        },
        mouseMove: function(e) {
            if ($.browser.msie && !e.button) {
                return this.mouseUp(e);
            }
            if (this._mouseStarted) {
                this.mouseDrag(e);
                return false;
            }
            if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
                this._mouseStarted = (this.mouseStart(this._mouseDownEvent, e) !== false); (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e));
            }
            return ! this._mouseStarted;
        },
        mouseUp: function(e) {
            $(document).unbind('mousemove.' + this.widgetName, this._mouseMoveDelegate).unbind('mouseup.' + this.widgetName, this._mouseUpDelegate);
            if (this._mouseStarted) {
                this._mouseStarted = false;
                this.mouseStop(e);
            }
            return false;
        },
        mouseDistanceMet: function(e) {
            return (Math.max(Math.abs(this._mouseDownEvent.pageX - e.pageX), Math.abs(this._mouseDownEvent.pageY - e.pageY)) >= this.options.distance);
        },
        mouseDelayMet: function(e) {
            return this._mouseDelayMet;
        },
        mouseStart: function(e) {},
        mouseDrag: function(e) {},
        mouseStop: function(e) {},
        mouseCapture: function(e) {
            return true;
        }
    };
    $.ui.mouse.defaults = {
        cancel: null,
        distance: 1,
        delay: 0
    };
}) (jQuery); 

(function($) {
    $.widget("ui.tabs", {
        init: function() {
            this.options.event += '.tabs';
            this.tabify(true);
        },
        setData: function(key, value) {
            if ((/^selected/).test(key))
            this.select(value);
            else {
                this.options[key] = value;
                this.tabify();
            }
        },
        length: function() {
            return this.$tabs.length;
        },
        tabId: function(a) {
            return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') || this.options.idPrefix + $.data(a);
        },
        ui: function(tab, panel) {
            return {
                options: this.options,
                tab: tab,
                panel: panel
            };
        },
        tabify: function(init) {
            this.$lis = $('li:has(a[href])', this.element);
            this.$tabs = this.$lis.map(function() {
                return $('a', this)[0];
            });
            this.$panels = $([]);
            var self = this,
            o = this.options;
            this.$tabs.each(function(i, a) {
                if (a.hash && a.hash.replace('#', ''))
                self.$panels = self.$panels.add(a.hash);
                else if ($(a).attr('href') != '#') {
                    $.data(a, 'href.tabs', a.href);
                    $.data(a, 'load.tabs', a.href);
                    var id = self.tabId(a);
                    a.href = '#' + id;
                    var $panel = $('#' + id);
                    if (!$panel.length) {
                        $panel = $(o.panelTemplate).attr('id', id).addClass(o.panelClass).insertAfter(self.$panels[i - 1] || self.element);
                        $panel.data('destroy.tabs', true);
                    }
                    self.$panels = self.$panels.add($panel);
                }
                else
                o.disabled.push(i + 1);
            });
            if (init) {
                this.element.addClass(o.navClass);
                this.$panels.each(function() {
                    var $this = $(this);
                    $this.addClass(o.panelClass);
                });
                if (o.selected === undefined) {
                    if (location.hash) {
                        this.$tabs.each(function(i, a) {
                            if (a.hash == location.hash) {
                                o.selected = i;
                                if ($.browser.msie || $.browser.opera) {
                                    var $toShow = $(location.hash),
                                    toShowId = $toShow.attr('id');
                                    $toShow.attr('id', '');
                                    setTimeout(function() {
                                        $toShow.attr('id', toShowId);
                                    },
                                    500);
                                }
                                scrollTo(0, 0);
                                return false;
                            }
                        });
                    }
                    else if (o.cookie) {
                        var index = parseInt($.cookie('ui-tabs' + $.data(self.element)), 10);
                        if (index && self.$tabs[index])
                        o.selected = index;
                    }
                    else if (self.$lis.filter('.' + o.selectedClass).length)
                    o.selected = self.$lis.index(self.$lis.filter('.' + o.selectedClass)[0]);
                }
                o.selected = o.selected === null || o.selected !== undefined ? o.selected: 0;
                o.disabled = $.unique(o.disabled.concat($.map(this.$lis.filter('.' + o.disabledClass), 
                function(n, i) {
                    return self.$lis.index(n);
                }))).sort();
                if ($.inArray(o.selected, o.disabled) != -1)
                o.disabled.splice($.inArray(o.selected, o.disabled), 1);
                this.$panels.addClass(o.hideClass);
                this.$lis.removeClass(o.selectedClass);
                if (o.selected !== null) {
                    this.$panels.eq(o.selected).show().removeClass(o.hideClass);
                    this.$lis.eq(o.selected).addClass(o.selectedClass);
                    var onShow = function() {
                        $(self.element).triggerHandler('tabsshow', [self.ui(self.$tabs[o.selected], self.$panels[o.selected])], o.show);
                    };
                    if ($.data(this.$tabs[o.selected], 'load.tabs'))
                    this.load(o.selected, onShow);
                    else
                    onShow();
                }
                $(window).bind('unload', 
                function() {
                    self.$tabs.unbind('.tabs');
                    self.$lis = self.$tabs = self.$panels = null;
                });
            }
            for (var i = 0, li; li = this.$lis[i]; i++)
            $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass': 'removeClass'](o.disabledClass);
            if (o.cache === false)
            this.$tabs.removeData('cache.tabs');
            var hideFx,
            showFx,
            baseFx = {
                'min-width': 0,
                duration: 1
            },
            baseDuration = 'normal';
            if (o.fx && o.fx.constructor == Array)
            hideFx = o.fx[0] || baseFx,
            showFx = o.fx[1] || baseFx;
            else
            hideFx = showFx = o.fx || baseFx;
            var resetCSS = {
                display: '',
                overflow: '',
                height: ''
            };
            if (!$.browser.msie)
            resetCSS.opacity = '';
            function hideTab(clicked, $hide, $show) {
                $hide.animate(hideFx, hideFx.duration || baseDuration, 
                function() {
                    $hide.addClass(o.hideClass).css(resetCSS);
                    if ($.browser.msie && hideFx.opacity)
                    $hide[0].style.filter = '';
                    if ($show)
                    showTab(clicked, $show, $hide);
                });
            }
            function showTab(clicked, $show, $hide) {
                if (showFx === baseFx)
                $show.css('display', 'block');
                $show.animate(showFx, showFx.duration || baseDuration, 
                function() {
                    $show.removeClass(o.hideClass).css(resetCSS);
                    if ($.browser.msie && showFx.opacity)
                    $show[0].style.filter = '';
                    $(self.element).triggerHandler('tabsshow', [self.ui(clicked, $show[0])], o.show);
                });
            }
            function switchTab(clicked, $li, $hide, $show) {
                $li.addClass(o.selectedClass).siblings().removeClass(o.selectedClass);
                hideTab(clicked, $hide, $show);
            }
            this.$tabs.unbind('.tabs').bind(o.event, 
            function() {
                var $li = $(this).parents('li:eq(0)'),
                $hide = self.$panels.filter(':visible'),
                $show = $(this.hash);
                if (($li.hasClass(o.selectedClass) && !o.unselect) || $li.hasClass(o.disabledClass) || $(this).hasClass(o.loadingClass) || $(self.element).triggerHandler('tabsselect', [self.ui(this, $show[0])], o.select) === false) {
                    this.blur();
                    return false;
                }
                self.options.selected = self.$tabs.index(this);
                if (o.unselect) {
                    if ($li.hasClass(o.selectedClass)) {
                        self.options.selected = null;
                        $li.removeClass(o.selectedClass);
                        self.$panels.stop();
                        hideTab(this, $hide);
                        this.blur();
                        return false;
                    } else if (!$hide.length) {
                        self.$panels.stop();
                        var a = this;
                        self.load(self.$tabs.index(this), 
                        function() {
                            $li.addClass(o.selectedClass).addClass(o.unselectClass);
                            showTab(a, $show);
                        });
                        this.blur();
                        return false;
                    }
                }
                if (o.cookie)
                $.cookie('ui-tabs' + $.data(self.element), self.options.selected, o.cookie);
                self.$panels.stop();
                if ($show.length) {
                    var a = this;
                    self.load(self.$tabs.index(this), $hide.length ? 
                    function() {
                        switchTab(a, $li, $hide, $show);
                    }: function() {
                        $li.addClass(o.selectedClass);
                        showTab(a, $show);
                    });
                } else
                throw 'jQuery UI Tabs: Mismatching fragment identifier.';
                if ($.browser.msie)
                this.blur();
                return false;
            });
            if (! (/^click/).test(o.event))
            this.$tabs.bind('click.tabs', 
            function() {
                return false;
            });
        },
        add: function(url, label, index) {
            if (index == undefined)
            index = this.$tabs.length;
            var o = this.options;
            var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label));
            $li.data('destroy.tabs', true);
            var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId($('a:first-child', $li)[0]);
            var $panel = $('#' + id);
            if (!$panel.length) {
                $panel = $(o.panelTemplate).attr('id', id).addClass(o.hideClass).data('destroy.tabs', true);
            }
            $panel.addClass(o.panelClass);
            if (index >= this.$lis.length) {
                $li.appendTo(this.element);
                $panel.appendTo(this.element[0].parentNode);
            } else {
                $li.insertBefore(this.$lis[index]);
                $panel.insertBefore(this.$panels[index]);
            }
            o.disabled = $.map(o.disabled, 
            function(n, i) {
                return n >= index ? ++n: n
            });
            this.tabify();
            if (this.$tabs.length == 1) {
                $li.addClass(o.selectedClass);
                $panel.removeClass(o.hideClass);
                var href = $.data(this.$tabs[0], 'load.tabs');
                if (href)
                this.load(index, href);
            }
            this.element.triggerHandler('tabsadd', [this.ui(this.$tabs[index], this.$panels[index])], o.add);
        },
        remove: function(index) {
            var o = this.options,
            $li = this.$lis.eq(index).remove(),
            $panel = this.$panels.eq(index).remove();
            if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1)
            this.select(index + (index + 1 < this.$tabs.length ? 1: -1));
            o.disabled = $.map($.grep(o.disabled, 
            function(n, i) {
                return n != index;
            }), 
            function(n, i) {
                return n >= index ? --n: n
            });
            this.tabify();
            this.element.triggerHandler('tabsremove', [this.ui($li.find('a')[0], $panel[0])], o.remove);
        },
        enable: function(index) {
            var o = this.options;
            if ($.inArray(index, o.disabled) == -1)
            return;
            var $li = this.$lis.eq(index).removeClass(o.disabledClass);
            if ($.browser.safari) {
                $li.css('display', 'inline-block');
                setTimeout(function() {
                    $li.css('display', 'block');
                },
                0);
            }
            o.disabled = $.grep(o.disabled, 
            function(n, i) {
                return n != index;
            });
            this.element.triggerHandler('tabsenable', [this.ui(this.$tabs[index], this.$panels[index])], o.enable);
        },
        disable: function(index) {
            var self = this,
            o = this.options;
            if (index != o.selected) {
                this.$lis.eq(index).addClass(o.disabledClass);
                o.disabled.push(index);
                o.disabled.sort();
                this.element.triggerHandler('tabsdisable', [this.ui(this.$tabs[index], this.$panels[index])], o.disable);
            }
        },
        select: function(index) {
            if (typeof index == 'string')
            index = this.$tabs.index(this.$tabs.filter('[href$=' + index + ']')[0]);
            this.$tabs.eq(index).trigger(this.options.event);
        },
        load: function(index, callback) {
            var self = this,
            o = this.options,
            $a = this.$tabs.eq(index),
            a = $a[0],
            bypassCache = callback == undefined || callback === false,
            url = $a.data('load.tabs');
            callback = callback || 
            function() {};
            if (!url || !bypassCache && $.data(a, 'cache.tabs')) {
                callback();
                return;
            }
            var inner = function(parent) {
                var $parent = $(parent),
                $inner = $parent.find('*:last');
                return $inner.length && $inner || $parent;
            };
            var cleanup = function() {
                self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass).each(function() {
                    if (o.spinner)
                    inner(this).parent().html(inner(this).data('label.tabs'));
                });
                self.xhr = null;
            };
            if (o.spinner) {
                var label = inner(a).html();
                inner(a).wrapInner('<em></em>').find('em').data('label.tabs', label).html(o.spinner);
            }
            var ajaxOptions = $.extend({},
            o.ajaxOptions, {
                url: url,
                success: function(r, s) {
                    $(a.hash).html(r);
                    cleanup();
                    if (o.cache)
                    $.data(a, 'cache.tabs', true);
                    $(self.element).triggerHandler('tabsload', [self.ui(self.$tabs[index], self.$panels[index])], o.load);
                    o.ajaxOptions.success && o.ajaxOptions.success(r, s);
                    callback();
                }
            });
            if (this.xhr) {
                this.xhr.abort();
                cleanup();
            }
            $a.addClass(o.loadingClass);
            setTimeout(function() {
                self.xhr = $.ajax(ajaxOptions);
            },
            0);
        },
        url: function(index, url) {
            this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url);
        },
        destroy: function() {
            var o = this.options;
            this.element.unbind('.tabs').removeClass(o.navClass).removeData('tabs');
            this.$tabs.each(function() {
                var href = $.data(this, 'href.tabs');
                if (href)
                this.href = href;
                var $this = $(this).unbind('.tabs');
                $.each(['href', 'load', 'cache'], 
                function(i, prefix) {
                    $this.removeData(prefix + '.tabs');
                });
            });
            this.$lis.add(this.$panels).each(function() {
                if ($.data(this, 'destroy.tabs'))
                $(this).remove();
                else
                $(this).removeClass([o.selectedClass, o.unselectClass, o.disabledClass, o.panelClass, o.hideClass].join(' '));
            });
        }
    });
    $.ui.tabs.defaults = {
        unselect: false,
        event: 'click',
        disabled: [],
        cookie: null,
        spinner: 'Loading&#8230;',
        cache: false,
        idPrefix: 'ui-tabs-',
        ajaxOptions: {},
        fx: null,
        tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>',
        panelTemplate: '<div></div>',
        navClass: 'ui-tabs-nav',
        selectedClass: 'ui-tabs-selected',
        unselectClass: 'ui-tabs-unselect',
        disabledClass: 'ui-tabs-disabled',
        panelClass: 'ui-tabs-panel',
        hideClass: 'ui-tabs-hide',
        loadingClass: 'ui-tabs-loading'
    };
    $.ui.tabs.getter = "length";
    $.extend($.ui.tabs.prototype, {
        rotation: null,
        rotate: function(ms, continuing) {
            continuing = continuing || false;
            var self = this,
            t = this.options.selected;
            function start() {
                self.rotation = setInterval(function() {
                    t = ++t < self.$tabs.length ? t: 0;
                    self.select(t);
                },
                ms);
            }
            function stop(e) {
                if (!e || e.clientX) {
                    clearInterval(self.rotation);
                }
            }
            if (ms) {
                start();
                if (!continuing)
                this.$tabs.bind(this.options.event, stop);
                else
                this.$tabs.bind(this.options.event, 
                function() {
                    stop();
                    t = self.options.selected;
                    start();
                });
            }
            else {
                stop();
                this.$tabs.unbind(this.options.event, stop);
            }
        }
    });
}) (jQuery);